package com.sinbad.common.generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.FileType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.io.File;
import java.util.Collections;

/**
 * 生成代码
 */
public class CodeGenerator {

  /** 生成到指定目录 */
  private static final String GENERATE_PATH =
      "D:\\WorkSpace02\\cloud-services\\cloud-shardingsphere\\src\\main";
  /** mapper文件目录 */
  private static final String MAPPER_PATH =
      "D:\\WorkSpace02\\cloud-services\\cloud-shardingsphere\\src\\main\\resources\\mapper\\";
    /**
     * 逆向生成的表
     */
    private static final String TABLE_NAMES = "user_0";
    /**
     * 表前缀不生成
     */
    private static final String PREFIX_VALUE = "";
    /**
     * 设置生成报包名
     */
    private static final String PAGE_NAME = "com.sinbad.shardingsphere";
    /**
     * MySQL连接配置
     */
    private static final String MYSQL_CONNECTION = "jdbc:mysql://192.168.1.135:3306/ds0?useUnicode=true&useSSL=false&characterEncoding=utf8";


    public static void main(String[] args) {

        // 代码生成器
        AutoGenerator mpg = new AutoGenerator().setGlobalConfig(
                // 全局配置
                new GlobalConfig()
                        //输出目录
                        .setOutputDir(GENERATE_PATH)
                        // 是否覆盖文件
//                        .setFileOverride(true)
                        //是否启用AR模式
//                        .setActiveRecord(true)
                        .setOpen(false)
//                        .setSwagger2(true)
                        .setAuthor("sinbad")
                        // 自定义文件命名，注意 %s 会自动填充表实体属性！
                        .setMapperName("%sMapper")
                        .setServiceName("%sService")
                        .setServiceImplName("%sServiceImpl")
                        .setControllerName("%sController")
        ).setDataSource(
                // 数据源配置
                new DataSourceConfig()
                        // 数据库类型
                        .setDbType(DbType.MYSQL)
                        .setDriverName("com.mysql.cj.jdbc.Driver")
                        .setUsername("root")
                        .setPassword("pass")
                        .setUrl(MYSQL_CONNECTION)

        ).setStrategy(
                // 策略配置
                new StrategyConfig()
                        // 表名生成策略
                        .setNaming(NamingStrategy.underline_to_camel)
                        // 需要生成的表
                        .setInclude(TABLE_NAMES.split(","))
                        //设置表前缀不生成
                        .setTablePrefix(PREFIX_VALUE)
                        //restful api风格控制器
                        .setRestControllerStyle(true)
                        //url中驼峰转连字符
                        .setControllerMappingHyphenStyle(true)
                // 排除生成的表
                //.setExclude(new String[]{"test"})
        ).setPackageInfo(
                // 包配置
                new PackageConfig()
                        // 自定义包路径
                        .setParent(PAGE_NAME)
                        // 这里是控制器包名，默认 web
                        .setController("controller")
                        .setEntity("entity")
                        .setMapper("mapper")
                        .setService("service")
                        .setServiceImpl("service.impl")
        ).setCfg(
                // 注入自定义配置，可以在 VM 中使用 cfg.abc 设置的值
                new InjectionConfig() {
                    @Override
                    public void initMap() {
                    }
                }.setFileOutConfigList(Collections.<FileOutConfig>singletonList(new FileOutConfig("/templates/mapper.xml.vm") {
                    // 自定义输出文件目录
                    @Override
                    public String outputFile(TableInfo tableInfo) {
                        return MAPPER_PATH + tableInfo.getEntityName() + "Mapper.xml";
                    }
                })).setFileCreate(new IFileCreate() {
                    @Override
                    public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
                        // 判断自定义文件夹是否需要创建,这里调用默认的方法
                        checkDir(filePath);
                        //对于已存在的文件，只需重复生成 entity 和 mapper.xml
                        File file = new File(filePath);
                        boolean exist = file.exists();
                        if (exist) {
                            if (true && FileType.ENTITY == fileType) {
                                return true;
                            } else if (true && filePath.endsWith("Mapper.xml")) {
                                return true;
                            } else {
                                return false;
                            }
                        }
                        //不存在的文件都需要创建
                        return true;
                    }
                })
        ).setTemplate(
                // 关闭默认 xml 生成，调整生成 至 根目录
                new TemplateConfig().setXml(null)
        );
        mpg.execute();
        System.err.println("--------完成逆向代码生成~~");

    }

}
